package com.yasin.base;

import org.apache.commons.codec.digest.DigestUtils;

import java.util.Arrays;
import java.util.Map;

/**
 * Created by huangyx on 2016/12/16 0016.
 */
public class SignatureUtil {

    /**
     * 生成 package 字符串
     *
     * @param map         map
     * @param paternerKey paternerKey
     * @return package_str
     */
    public static String generatePackage(Map<String, String> map, String paternerKey) {
        String sign = generateSign(map, paternerKey);
        Map<String, String> tmap = MapUtil.order(map);
        String s2 = MapUtil.mapJoin(tmap, false, true);
        return s2 + "&sign=" + sign;
    }

    /**
     * 生成sign MD5 加密 toUpperCase
     *
     * @param map         map
     * @param paternerKey paternerKey
     * @return sign
     */
    public static String generateSign(Map<String, String> map, String paternerKey) {
        Map<String, String> tmap = MapUtil.order(map);
        if (tmap.containsKey("sign")) {
            tmap.remove("sign");
        }
        String str = MapUtil.mapJoin(tmap, false, false);
        return DigestUtils.md5Hex(str + "&key=" + paternerKey).toUpperCase();
    }

    /**
     * 生成 paySign
     *
     * @param map        map
     * @param paySignKey paySignKey
     * @return pay sign
     */
    public static String generatePaySign(Map<String, String> map, String paySignKey) {
        if (paySignKey != null) {
            map.put("appkey", paySignKey);
        }
        Map<String, String> tmap = MapUtil.order(map);
        String str = MapUtil.mapJoin(tmap, true, false);
        return DigestUtils.sha1Hex(str);
    }

    /**
     * mch 支付、代扣异步通知签名验证，
     * 该方法可以替代 mch 支付、代扣异步通知验证，用以防止官方返回参数与bean不一至而导致签名错误。
     *
     * @param map 参与签名的参数
     * @param key mch key
     * @return boolean
     */
    public static boolean validateSign(Map<String, String> map, String key) {
        return map.get("sign").equals(generateSign(map, key));
    }

    /**
     * 生成事件消息接收签名
     *
     * @param token     token
     * @param timestamp timestamp
     * @param nonce     nonce
     * @return str
     */
    public static String generateEventMessageSignature(String token, String timestamp, String nonce) {
        String[] array = new String[]{token, timestamp, nonce};
        Arrays.sort(array);
        String s = StringUtils.arrayToDelimitedString(array, "");
        return DigestUtils.shaHex(s);
    }

}